﻿Public Class FrmStageMAJ

    Private szSQL As String
    Private rs As ADODB.Recordset
    Private m_SortingColumn As ColumnHeader
    Private m_SortingIndex As Integer = 0

    Private Sub FrmStageMAJ_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Me.Text = LibelleStage(gTypePlanning)
        Me.Text = Me.Text & " - " & gSemaine & " - " & gGroupe

        StageToScreen()
        If gUserAcces < 9 Then
            TE_DEBUT.Enabled = False
            TE_FIN.Enabled = False
            BO_VALIDER.Enabled = False
        Else
            TE_DEBUT.Enabled = True
            TE_FIN.Enabled = True
            BO_VALIDER.Enabled = True
        End If
        GB_STAGE.Text = "Stage du " & gSemaine
        InitListeInscrits(0)

    End Sub

    Private Sub StageToScreen()

        ' Lire la table des planning stage
        szSQL = "CALL spGet_PLA_STAGE('" & gTypePlanning & "'," & gSemaine & ",'" & gGroupe & "')"
        GetRecordset(ctDSN_AEM, szSQL, rs)
        If rs.RecordCount > 0 Then
            TE_GROUPE.Text = rs.Fields("groupe").Value
            TE_DEBUT.Text = rs.Fields("debut").Value
            TE_FIN.Text = rs.Fields("fin").Value
            TE_TOTAL.Value = rs.Fields("total").Value
            TE_LIBELLE.Text = nv(rs.Fields("libelle").Value)
            TE_BAFM.Text = nv(rs.Fields("formateur").Value)
            TE_PSY.Text = nv(rs.Fields("psychologue").Value)
            TE_NOM_BAFM.Text = nv(rs.Fields("nom_formateur").Value)
            TE_NOM_PSY.Text = nv(rs.Fields("nom_psy").Value)
            TE_VALIDE.Text = nv(rs.Fields("valide").Value)
            TE_MODIF_LE.Text = "Dernière modif par " & rs.Fields("cd_uti").Value & " (" & rs.Fields("agence").Value & ")"
            If nv(rs.Fields("valide").Value) = "O" Or gUserAcces < 9 Then
                BO_ENREGISTRER.Enabled = False
                BO_SUPPRIMER.Enabled = False
                TE_TOTAL.Enabled = False
            Else
                BO_ENREGISTRER.Enabled = True
                BO_SUPPRIMER.Enabled = True
                TE_TOTAL.Enabled = True
            End If
        End If
        rs.Close()

    End Sub

    Private Sub InitListeInscrits(ByVal ix As Integer)
        Dim rsEleve As ADODB.Recordset = Nothing
        Dim nb As Integer = 0
        Dim nbHeuresPrises As Integer = 0

        ' effacer la listview
        LV_INSCRITS.Items.Clear()
        LV_INSCRITS.ListViewItemSorter = Nothing

        ' Lire la table des lignes planning stage
        szSQL = "CALL spGet_PLA_STAGE_LIGNES('" & gTypePlanning & "'," & gSemaine & ",'" & gGroupe & "',0)"
        GetRecordset(ctDSN_AEM, szSQL, rs)

        Do While Not rs.EOF
            ' Lire le nombre d'heures prises
            szSQL = "CALL spGet_ELEVES_HEURES_PRISES(" & rs.Fields("cd_cli").Value & ")"
            GetRecordset(ctDSN_AEM, szSQL, rsEleve)
            If rsEleve.RecordCount > 0 Then
                nbHeuresPrises = rsEleve.Fields("nb").Value
            Else
                nbHeuresPrises = 0
            End If
            LV_INSCRITS.Items.Add(nv(rs.Fields("cd_mon").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(rs.Fields("niveau").Value)
            LV_INSCRITS.Items(nb).SubItems.Add(nz(rs.Fields("cd_cli").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("nom").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(Zero2Space(rs.Fields("solde").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(IfDate(rs.Fields("dossier_date").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("filiere").Value))
            LV_INSCRITS.Items(nb).SubItems.Add(Zero2Space(nbHeuresPrises))
            LV_INSCRITS.Items(nb).SubItems.Add(nv(rs.Fields("lieu").Value))
            If nv(rs.Fields("valide").Value) = "O" Then
                LV_INSCRITS.Items(nb).ForeColor = Color.Green
            Else
                If IsEleve(nz(rs.Fields("cd_cli").Value)) = False Then
                    LV_INSCRITS.Items(nb).ForeColor = Color.Violet
                Else
                    If nz(rs.Fields("statut").Value) > 1 Then
                        LV_INSCRITS.Items(nb).ForeColor = Color.Red
                    End If
                End If
            End If
            rs.MoveNext()
            nb = nb + 1
        Loop
        ' Close the recordset AND connection.
        rs.Close()
        TE_INSCRITS.Text = nb
        ' restaurer l'ancienne ordre de tri de la listview
        If m_SortingIndex > 0 Then
            SortListView(LV_INSCRITS, m_SortingColumn, m_SortingIndex)
        End If
        ' restaurer la position du curseur avant le init
        setIndice(ix, LV_INSCRITS)
    End Sub

    Private Sub LV_INSCRITS_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles LV_INSCRITS.ColumnClick
        SortListView(LV_INSCRITS, m_SortingColumn, e.Column)
        m_SortingIndex = e.Column
    End Sub

    Private Sub LV_INSCRITS_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles LV_INSCRITS.DoubleClick

        If LV_INSCRITS.SelectedItems.Count > 0 Then
            ' afficher les détails de la ligne NoLigne
            FrmStageLigne.pCD_CLI = LV_INSCRITS.SelectedItems(0).SubItems(2).Text
            FrmStageLigne.ShowDialog()
            ' réaffiche la viewlist
            InitListeInscrits(LV_INSCRITS.SelectedItems(0).Index)
        End If

    End Sub

    Private Sub LV_INSCRITS_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles LV_INSCRITS.KeyDown

        Select Case e.KeyCode
            Case Keys.Enter         ' Enter = DoubleClick
                LV_INSCRITS_DoubleClick(sender, e)

            Case Keys.Insert        ' Insert = ' Ajouter un élève
                BO_ADD_LIGNE_Click(sender, e)

        End Select

    End Sub

    Private Sub BO_ADD_LIGNE_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BO_ADD_LIGNE.Click
        ' utilisateur autorisé ou stage déjà crée ?
        If gUserAcces < 6 Or gTypePlanning.Length = 0 Then
            Exit Sub
        End If
        If TE_VALIDE.Text = "O" Then
            MsgBox("Ce stage étant déjà validé, il est impossible de le modifier. ", MsgBoxStyle.Critical)
            Exit Sub
        End If
        If TE_TOTAL.Value <= TE_INSCRITS.Text Then
            MsgBox("Plus de place disponibles dans ce stage", MsgBoxStyle.Critical)
            Exit Sub
        End If

        ' afficher les détails de la ligne NoLigne
        FrmStageLigne.pCD_CLI = 0
        FrmStageLigne.ShowDialog()
        ' réaffiche la viewlist
        InitListeInscrits(LV_INSCRITS.Items.Count)
    End Sub

    Private Function DateInWeek(ByVal _date As Date) As Boolean
        ' contrôler que la date appartient à la semaine
        Dim nSemaine As Integer
        Dim nAnnee As Integer
        Dim dDate As Date = getLundiPrecedent(_date)

        nSemaine = Format(DatePart(DateInterval.WeekOfYear, dDate, , FirstWeekOfYear.Jan1), "00")
        nAnnee = dDate.Year
        If gSemaine = nAnnee * 100 + nSemaine Then
            DateInWeek = True
        Else
            DateInWeek = False
        End If
    End Function

    Private Sub BO_ENREGISTRER_Click_1(sender As System.Object, e As System.EventArgs) Handles BO_ENREGISTRER.Click

        If DateInWeek(TE_DEBUT.Value) = False Then
            MsgBox("Cette date n'appartient pas à la semaine " & Mid(CStr(gSemaine), 5), MsgBoxStyle.Critical)
            TE_DEBUT.Focus()
            Exit Sub
        End If
        If DateInWeek(TE_FIN.Value) = False Then
            MsgBox("Cette date n'appartient pas à la semaine " & Mid(CStr(gSemaine), 5), MsgBoxStyle.Critical)
            TE_FIN.Focus()
            Exit Sub
        End If
        If TE_TOTAL.Value < CInt(TE_INSCRITS.Text) Then
            MsgBox("Nombre de places ne peut inférieur au nombre d'inscrits", MsgBoxStyle.Critical)
            TE_TOTAL.Focus()
            Exit Sub
        End If
        ' mise à jour 
        szSQL = "CALL spUpd_PLA_STAGE('" & gTypePlanning & "'," & gSemaine & ",'" & gGroupe & "'," & _
                 TE_TOTAL.Value & ",'" & TE_LIBELLE.Text & "','" & Format(TE_DEBUT.Value, "yyyy/MM/dd") & "','" & Format(TE_FIN.Value, "yyyy/MM/dd") & "','" & _
                 TE_BAFM.Text & "','" & TE_PSY.Text & "','" & TE_NOM_BAFM.Text & "','" & TE_NOM_PSY.Text & "'," & gUserAgence & ",'" & gUserCode & "')"
        If ExecQuery(ctDSN_AEM, szSQL) Then
            ' fermer la fenetre
            Me.Close()
        End If

    End Sub

    Private Sub BO_SUPPRIMER_Click(sender As System.Object, e As System.EventArgs) Handles BO_SUPPRIMER.Click

        ' le stage est-il rempli ?
        If TE_INSCRITS.Text <> "0" Then
            MsgBox("Ce stage n'est pas vide. Suppression interdite.", MsgBoxStyle.Critical)
        Else
            ' suppression
            If deleteEnregistrement("pla_stage", Me.Text, gTypePlanning, gSemaine, gGroupe) Then
                ' suppression confirmée
                Me.Close()
            End If
        End If

    End Sub

    Private Sub BO_IMPRIMER_Click_1(sender As System.Object, e As System.EventArgs) Handles BO_IMPRIMER.Click

        ' Editions des états de la rubrique
        FrmEditions.pRubrique = "STAGE"
        FrmEditions.pParametres = ""
        FrmEditions.ShowDialog()

    End Sub

    Private Sub BO_VALIDER_Click(sender As System.Object, e As System.EventArgs) Handles BO_VALIDER.Click
        Dim rsFormule As ADODB.Recordset = Nothing
        Dim rsTarif As ADODB.Recordset = Nothing
        Dim mtValeur As Decimal
        Dim refStage As String
        Dim nStatut As Integer
        Dim szIntitule As String

        If MsgBox("Après la validation, aucune modification ne sera possible." & vbNewLine & _
                  "Voulez-vous valider le stage du " & CStr(gSemaine) & " ?", MsgBoxStyle.OkCancel, _
                  "Validation du planning STAGE") = MsgBoxResult.Cancel Then
            Exit Sub
        End If

        ' y a-t-il des élèves provisoires dans le stage ?
        If StageHasPending(gTypePlanning, gSemaine, gGroupe) = True Then
            MsgBox("Il y a un ou des élèves provisoires dans ce stage. Validation impossible.", vbCritical)
            Exit Sub
        End If

        ' Lire les élèves inscrits dans ce stage
        szSQL = "CALL spGet_PLA_STAGE_LIGNES('" & gTypePlanning & "'," & gSemaine & ",'" & gGroupe & "',0)"
        GetRecordset(ctDSN_AEM, szSQL, rs)

        Me.Cursor = Cursors.WaitCursor

        Do While Not rs.EOF
            ' Lire l'élève sélectionné
            gCD_CLI = rs.Fields("cd_cli").Value
            ' lire sa formule 
            szSQL = "CALL spGet_FORMULES('" & rs.Fields("formule").Value & "')"
            GetRecordset(ctDSN_AEM, szSQL, rsFormule)
            If rsFormule.RecordCount < 1 Then
                MsgBox("Formule " & rs.Fields("formule").Value & " non trouvée pour l'élève " & gCD_CLI, MsgBoxStyle.Critical)
                rs.MoveNext()
                Continue Do
            End If
            ' rechercher de la REF du stage ou forfait pour mémoriser le montant déjà valorisé
            mtValeur = 0
            refStage = ""
            ' lire le traif de INS1 
            szSQL = "CALL spGet_TARIFS('" & rsFormule.Fields("ins1").Value & "')"
            GetRecordset(ctDSN_AEM, szSQL, rsTarif)
            If rsTarif.RecordCount > 0 Then
                If rsTarif.Fields("fam").Value = "S" Or rsTarif.Fields("fam").Value = "F" Then
                    refStage = rsTarif.Fields("ref").Value
                    mtValeur = rsTarif.Fields("puttc").Value - rsFormule.Fields("mtval1").Value
                Else
                    ' lire le traif de INS2
                    szSQL = "CALL spGet_TARIFS('" & rsFormule.Fields("ins2").Value & "')"
                    GetRecordset(ctDSN_AEM, szSQL, rsTarif)
                    If rsTarif.RecordCount > 0 Then
                        If rsTarif.Fields("fam").Value = "S" Or rsTarif.Fields("fam").Value = "F" Then
                            refStage = rsTarif.Fields("ref").Value
                            mtValeur = rsTarif.Fields("puttc").Value - rsFormule.Fields("mtval2").Value
                        Else
                            ' lire le traif de INS3
                            szSQL = "CALL spGet_TARIFS('" & rsFormule.Fields("ins3").Value & "')"
                            GetRecordset(ctDSN_AEM, szSQL, rsTarif)
                            If rsTarif.RecordCount > 0 Then
                                If rsTarif.Fields("fam").Value = "S" Or rsTarif.Fields("fam").Value = "F" Then
                                    refStage = rsTarif.Fields("ref").Value
                                    mtValeur = rsTarif.Fields("puttc").Value - rsFormule.Fields("mtval3").Value
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            rsTarif.Close()
            rsFormule.Close()

            nStatut = rs.Fields("statut").Value
            If nStatut = 0 Then
                nStatut = 1
            End If
            If nStatut < 10 Or (nStatut >= 21 And nStatut <= 24) Or nStatut = 28 Then
                szIntitule = "STAGE EFFECTUE (" & nStatut & ")"
            Else
                szIntitule = "STAGE NON EFF. (" & nStatut & ")"
            End If
            ' gènère un debit
            szSQL = "CALL spINS_ELEVES_DEBIT_STAGE(" & gCD_CLI & ",'" & Format(TE_FIN.Value, "yyyy/MM/dd") & "','" & refStage & "',0,'" & _
                     szIntitule & "',1," & mtValeur & "," & nStatut & "," & gUserAgence & ",'" & gUserCode & "')"
            ExecQuery(ctDSN_AEM, szSQL)

            ' marquer statut de la ligne à validé
            szSQL = "UPDATE pla_stage_lignes set valide='O', agence=" & gUserAgence & ", cd_uti='" & gUserCode & _
                     "' WHERE type='" & gTypePlanning & "' AND semaine=" & gSemaine & " AND groupe='" & gGroupe & "' AND cd_cli=" & gCD_CLI
            ExecQuery(ctDSN_AEM, szSQL)

            ' élève suivant
            rs.MoveNext()
        Loop
        rs.Close()

        ' marquer statut du stage à validé
        szSQL = "UPDATE pla_stage set valide='O', agence=" & gUserAgence & ", cd_uti='" & gUserCode & _
                 "' WHERE type='" & gTypePlanning & "' AND semaine=" & gSemaine & " AND groupe='" & gGroupe & "'"
        ExecQuery(ctDSN_AEM, szSQL)
        Me.Cursor = Cursors.Default

        InitListeInscrits(0)

    End Sub


    Private Sub BO_RECH_BAFM_Click(sender As System.Object, e As System.EventArgs) Handles BO_RECH_BAFM.Click
        'affiche la liste des Moniteurs pour sélection
        frmTablesSearch.pTable = "moniteurs"
        frmTablesSearch.pTitre = "Sélectionner un formateur"
        frmTablesSearch.pCode = TE_BAFM.Text
        frmTablesSearch.ShowDialog()
        If frmTablesSearch.pCode.Length > 0 Then
            TE_BAFM.Text = frmTablesSearch.pCode
            TE_NOM_BAFM.Text = frmTablesSearch.pLibelle
        End If

    End Sub

    Private Sub BO_RECH_PSY_Click(sender As System.Object, e As System.EventArgs) Handles BO_RECH_PSY.Click
        'affiche la liste des Moniteurs pour sélection
        frmTablesSearch.pTable = "moniteurs"
        frmTablesSearch.pTitre = "Sélectionner un(e) psyclogogue"
        frmTablesSearch.pCode = TE_PSY.Text
        frmTablesSearch.ShowDialog()
        If frmTablesSearch.pCode.Length > 0 Then
            TE_PSY.Text = frmTablesSearch.pCode
            TE_NOM_PSY.Text = frmTablesSearch.pLibelle
        End If

    End Sub

    Private Sub TE_BAFM_TextChanged(sender As System.Object, e As System.EventArgs) Handles TE_BAFM.TextChanged
        If TE_BAFM.TextLength = 0 Then
            TE_NOM_BAFM.Clear()
        End If
    End Sub

    Private Sub TE_PSY_TextChanged(sender As System.Object, e As System.EventArgs) Handles TE_PSY.TextChanged
        If TE_PSY.TextLength = 0 Then
            TE_NOM_PSY.Clear()
        End If
    End Sub
End Class